//配置路由的地方
import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './routes'
//使用插件
Vue.use(VueRouter);
//引入store
import store from '@/store'

//先把VueRouter原型对象的push保存一份
let originPush=VueRouter.prototype.push;
let originReplace=VueRouter.prototype.replace;

//重写push|replace方法
//第一个参数，告诉原来的push方法，往哪跳转
//第二个参数：成功的回调
//第三个参数：失败的回调
VueRouter.prototype.push=function(location,resolve,reject){ 
    if(resolve && reject){
        //call||apply
        //相同点：都可以调用函数一次，都可以篡改函数的上下文一次
        //不同点：call和apply传递参数：call传递参数用逗号隔开，apply方法执行，传递数组
        originPush.call(this,location,resolve,reject);
    }else{
        originPush.call(this,location,()=>{},()=>{});
    }   
}

VueRouter.prototype.replace=function(location,resolve,reject){
   if(resolve&&reject){
    originReplace.call(this,location,resolve,reject)
   }else{
    originReplace.call(location,()=>{},()=>{})
   }
}
//配置路由
 let router = new VueRouter({
    //配置路由
    routes,
    //滚动行为  保证跳转新页面 滚动条在最上方
    scrollBehavior (to, from, savedPosition) {
        return { y:0}
    }
})

// 全局路由守卫：前置守卫（在路由跳转之前进行判断）
router.beforeEach(async (to,from,next)=>{
   //to:可以获取到你要跳转到哪个路由的信息
   //from:可以获取到你从哪个路由来的信息
   //next：放行函数  next()方行
   //next('/login') 放行到指定位置            next(false)
   let token = store.state.user.token
   //用户信息里的name属性  用来判断userInfo是不是空对象
   let name =store.state.user.userInfo.name
   //用户已经登录
   if(token){
    //用户已经登录还想去login  拒绝请求
    if(to.path=='/login'){
        next(from.path)
    }else{
       //登录了 去的不是login【home|search|detail|shopcart】
       //如果用户名有
       if(name){
        next()
       }else{
        //没有用户名信息,派发action让仓库存储用户信息在跳转
         //获取用户信息在首页展示
        try {
          await store.dispatch('getUserInfo')
          //获取用户信息成功  放行
          next();
        } catch (error) {
          //token失效了 获取不到用户信息，重新登录
          //清除token
          try {
            await  store.store.dispatch('userLogOut')
            next('/login')
          } catch (error) {
            alert(error.message)
          }
        }

       }
    }
   }else{
    //未登录：不能去交易相关、不能去支付相关【pay|paysuccess】、不能去个人中心
    //为登录去上面这些路由---登录
    let toPath=to.path
    if(toPath.indexOf('/trade')!=-1 || toPath.indexOf('/pay')!=-1 || toPath.indexOf('/center')!=-1 ||toPath.indexOf('cart')!=-1){
      //把未登录的时候想去而没有去程的信息，存储于地址栏中【路由】
      next('/login?redirect='+toPath)
    }else{
     //去的不是上面这些路由--放行
     next();
    }
   }
});



export default router;